{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Simple Gaussian Processes Regression example\n",
    "\n",
    "Here you can find a small example of how to code your GP regression from scratch using squared exponential covariance function and\n",
    "Sampling functions from the join probability distribution of GP given only the choice of covariance function. Covariance function determines how much correlation are there between inputs points. \n",
    "\n",
    "My inspiration (http://katbailey.github.io/post/gaussian-processes-for-dummies/)\n",
    "\n",
    "### Squared exponential\n",
    "\n",
    "$$k(x,y) = s*\\mathrm{exp}(-\\frac{(x-y)^2}{2l^2})$$\n",
    "\n",
    "$l$ - length scale\n",
    "$s$ - signal variance\n",
    "\n",
    "If the length scale parameter is small, the covariance of the parameters should be small and thus parameters are kinda tight to each other and the curve is spiky.\n",
    "If the length scale parameter is big, the covariance is big and thus parameters are more independent\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## How to think about GP so that it doesn't seem like a nightmare.\n",
    "\n",
    "GP is a collection of functions specified by mean and covariance functions. By specifying these two functions, we can already sample functions for GP. \n",
    "_Sampling a function_ means that we get an estimate or guess how the function may look like that will describe the given data (points). Adding training points (points with known function values) reduces the space of function, restricting only to those, which pass through the given training points. While adding the points, we update/adapt the mean and covariance function. We are doing that by computing the joined multi-dimensional Gaussian distribution. This Gaussian will have as many dimensions as a number of points in training set. \n",
    "\n",
    "Whenever we want to make predictions for some other points, we need to compute the joined Gaussian distribution between the points we already have (training) and testing points.\n",
    "\n",
    "![image_name](../data/gp_starting/gaussian_processes.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.figure.Figure at 0x10d241d50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# setting the kernel function / covariance\n",
    "# here square exponential\n",
    "def kernel(xi, xj, l, signal_var):\n",
    "    sqDist = (xi - xj)**2\n",
    "    return signal_var*np.exp(-0.5*(1.0/l**2) *sqDist)\n",
    "\n",
    "def computeCovariance(x, y, l, signal_var):\n",
    "    M = len(x)\n",
    "    N = len(y)\n",
    "    K = np.zeros((M,N))\n",
    "    for i, xi in enumerate(x):\n",
    "        for j, yj in enumerate(y):\n",
    "            K[i,j] = kernel(xi, yj, l, signal_var)\n",
    "    return K\n",
    "\n",
    "## samples from any gaussian using N(0,1)\n",
    "#  x -> mu + sigma(N(0,1))\n",
    "# N- number of points the sample function should be evaluated in\n",
    "def sampleFromGaussian(mu, sigma, N):\n",
    "    B = np.linalg.cholesky(sigma + 1e-9*np.eye(N))\n",
    "    s = np.random.normal(0, 1, N)\n",
    "    samples = mu + np.dot(B,s)\n",
    "    return samples\n",
    "\n",
    "x_test = np.linspace(-5, 5, 60)\n",
    "N = len(x_test)\n",
    "\n",
    "L = np.arange(0.5, 2.0, 0.5)\n",
    "L = np.append(L,[0.01])\n",
    "\n",
    "signal_var = 0.1\n",
    "\n",
    "for l in L:\n",
    "    # construct K** matrix\n",
    "    K = computeCovariance(x_test, x_test, l, signal_var)\n",
    "    mu = np.zeros(N)\n",
    "    f_prior = sampleFromGaussian(mu,K, N)\n",
    "\n",
    "    plt.plot(x_test, f_prior, '-',label=str(l))\n",
    "\n",
    "\n",
    "plt.legend()\n",
    "plt.title(\"Varying length scale l\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Updating GP posterior based on training points\n",
    "The parameters of the GP for the posterior distribution are updated based on training points $X$ and points for which the predictions are needed $X_*$\n",
    "$$\\mu(X_*) = K(X_*,X)K(X,X)^{-1}y$$\n",
    "$$V(X_*) = K(X_*, X_*) - K(X_*,X)K(X,X)^{-1}K(X,X_*)$$\n",
    "\n",
    "**Hint**: Keep in mind that xs( X_start) are only needed for visualizing the function. If you want a prediction for a point xs should be a point. But GP exists (in some high dimensional magical space also without xs, :) also without x, as a prior given a kernel function, but x constrain the space of GP)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD8CAYAAACfF6SlAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsnXd0XMXZh5/ZvtqmVe+WC7axccXG9I5t4KOHmgIhQOgthBK6Q2wIoSb0EkJPaAFCMc2mGGxjY9x7US8rabW93/n+kCXLtiRL1kpWuc85nIN3587MXe3+7sw7bxFSSlRUVFRUBheafT0BFRUVFZXeRxV/FRUVlUGIKv4qKioqgxBV/FVUVFQGIar4q6ioqAxCVPFXUVFRGYSo4q+ioqIyCFHFX0VFRWUQooq/ioqKyiBEt68n0B4ZGRmyuLh4X09DRUVFpV+xdOnSOill5p7a9VnxLy4uZsmSJft6GioqKir9CiFESWfaqWYfFRUVlUGIKv4qKioqgxBV/FVUVFQGIar4q6ioqAxCVPFXUVFRGYSo4q+ioqIyCFHFX0VFRWUQooq/ioqKyiCkzwZ5qQxs4vE44XCYSCRCOBxGo9FgMBgwGAyYzWZ0OvWrqaLSk6i/sEFGLBYjGo0Sj8eJxWIAGAwG9Ho9RqMRjaZnN4PxeJyGhgYCgQAAUsqW90KhEEIIACwWC06nE71e36PzUVEZrKjiPwiIx+P4/X58Ph/xeBzYWXSbBReaRNfhcGA0GpM6Byklbrcbj8ez09httQPw+/0EAgFsNhvp6ek7zVFFRaX7qOI/gFEUBbfbjdfrBWhXdFu/3iy6BoOB7OzspJhfFEWhpqaGcDjcofC3NS+fz0c4HCYnJ0c1BamoJBH1wHcAIqXE4/FQUlKC1+tFStll0Y1EIpSVleHz+bo1l0QiQUVFRZeFv/VcotEo5eXlhMPhbs1FRUVlB6r4DzDi8ThVVVU0NDR0WfR3RUpJXV0dNTU1e9VPIpGgvLycWCzW9vVKHG2gGn3jZjQRD3QwhqIoVFVVEYlEujwPFRWV3VH30QOIYDC410LdHlLKln6zs7M7bXuXUlJVVUUikWh5TUT9pFR8i6X0K0y1y9GG6xFSaXlf0RqJW/MJFhxJYMhxRNLHQqvxpJRUVlaSn5+PwWBI2j2qqAxGVPEfADSbedxud1KFv3X/oVCI6upqcnJy9vgAkFLicrlavIl03lKcK57Fuu0zhBIjbkonlHcwcWse8ZRsFL0FXagObdCFwb0Rx5pXSV39EjFLLo3jL8U3/FTQaFv6bn4AqJ5AKip7jyr+/ZxmoQ0EAj0i/K3HCYfDVFVVkZub2+EDwOPxEAgE0Pirca54Ftum95EaPd79zsRfPINI5vgWMW8LTcRLSvnX2Ne/ReYPs3CsfY36ydcRKjgC2GECKigo6HHXVBWVgYroScHoDlOmTJFqJa+OaRbBaDTao8LfGiEEdrud9PT0Nt8Ph8NUVVZi2fIRGYvuRyQieEeeReMBF5NI2WNluZ2REkvplzh/+jsGXym+4adRN+1WpM6EEAKLxUJWVlYS7kpFZeAghFgqpZyyp3bqyr+fkkgkqKysbDGt9BZSSrxeLwaDAZvNttt7dWUbyfxuFtaSzwhnTqT28FnEbYV7N5gQBIYcT6DwKJzLn8W58nkMDWupOepB4vYiAoEAPp9vt3moqKjsmaTsmYUQLwohaoUQq9p5XwghHhdCbBJCrBBCTE7GuIOVeDxORUVFrwt/M81eQLt63ng2LSL7/XOwlH5Fw6SrqZzx/N4Lf2s0etyTrqLq2MfRBarJ/+iXmKqXtMwjGo12fwwVlUFGsgymLwEzO3j/RGC/7f9dBjyVpHEHHc3C3xypu69oPnhdt87DkUdKSr+dj+0/ZyESUSpnvohrzMVU+BNsbYjgCsQIx5Vum6ZCBUdQ8X9vkEjJIuera1oeAMn2cFJRGQwkxewjpfxGCFHcQZPTgJdl0y90oRAiVQiRK6WsSsb4g4Vm4W/tPrkvkVJy332CBd9J5ty4mXvPyuB2460s/QzcwVVIqQV2HAynmrRMyrMwuSCFgwqsZFq77q0Tt+ZRNf1Zcj+7jJwvr6H6uL8TyZ2Kx+MhNTU1iXenojKw6S2bfz5Q1urf5dtfU8W/k/Q14d9/TDHRyI6N49NLfsfTS34H+hhDXvkl1vB6BApmjY1UTT4WkYcMF7G8YjjztnjRCDh2uJ3zJ2YwNK1reYQS5nQqpz9H3meXkvPlNVSd8BRuJmGxWFT3TxWVTtJb4t+WX+Bu+3QhxGU0mYUoKirq6Tn1G/qC8EspWefbyOsNm/kiZqbwwfeoe/1yPD+dAFEDGOOIw13IK7dSlnYFd7AUvQxTHfVQHdhKSfB7wtqv0A3RMc0yHn1oMt+tG84Xm7wcOdTG1Ydmk2HpvHAr5rSmB8CnvyV7/h+oOOlVamsN5OXlqUngVFQ6QW+JfznQ+uSvAKjctZGU8lngWWhy9eydqfVt9rXwV4WqmF87n3caS1htPYGofiw6jZ8DDIVMUmp5J6bDYFSIRrVckJPCzeOz2BCLMdl4JlJKzq2txeoQzHI4ENESFrgWsKBuAa7ETxSNyyM/cTLfrx7Gz5VBrj88h6OH2zs9N8WcRs2xj5L/8W/ImXcDVSe+hM9nw27vfB8qKoOV3oqQ+QD4zXavn4MBj2rv3zP7SvgVqbCkYQn3rLqH3y+5gocCGpY5L0AkLGQs9/DYikV8WfUa0fhoLrjAw7vvVnHBBV5cLh1WjYbJ29NBK8B0s5llkQj/V1PDa7EMzi++kGenPsut+9+KQaNnSew5isc/TYazhllfVjD7qwrCcaXjCbYi5hhKzRGzMbg3kLHgLurr6lCUzl+vojJYSUqQlxDiDeBoIAOoAe4G9ABSyqdF0z78HzR5BAWB30opO4zgGuxBXs3ZMHvTqyemxJhXO493y96lKlyF0+DkuMwZvBE6iCqXZGyt4G8jN3LIytsJ5Uyj+tjHEDoDqamp6PV6XC5Xm1437kSCxz0eXvb7Ga3X81xmJnk6HYpU+M71HS9ufRFfzMco3aksWjGFsdkW7ptRiN3UfhTwrjhW/Yv0nx6l/sAbkIdcTUZGRjI/GhWVfkNng7zUCN8+SG8Lf0yJ8Vn1Z7xb/i51kTqGW4czNOd8Roj9eHVeHVW+GGePT+PqwlIK511NNG0UVSc8DYamCFuLxYKUkoqKig597ueHQjzj9fJ8ZiaWVmkZvDEvT296mgV1C8g3jGLzmnPIt6bxwImFnfcIkpLsr28ipfxbKk5+jezxx6qHvyqDElX8+ym9KfyKVPjW9S2vbnuV2kgtY+xjOLvobFZrR3Cvu5GU2jhjNia4/dh8Jhsryf/0t8RTMqmc8SLS7MTpdO7kXhmNRqmoqNhjpS4hBCFF4atQiJMtlpbX59fO58lNT2LROKnbfCFWkcWjpw4hx9a5DJ6asJuCD84mYUqj4RfvkFswpHsfkIpKP6Sz4q9mxepDNKds6A3hX+tZy00/38TD6x/GorNw7wH3MmfCHH4Sw7mnsRGTK870eh3PnDmUifYAOV9dg6IzUXXcEyimJsHf9WDVYDBgtVo7HLfZE+cln49r6+v5+/ayjkIIjsk+hvvG3UeCEPZhTxHUbOOWj8vwhDv3eSgmJ65D78bYuBHzDw8RCoX24pNRURkcqOLfR+itXD2eqIfHNjzGrStuxRPzcMOoG3h40sNMdE7kVbeXOV4PKTVxbtJY+euMQlK1MXLmXYc24qH62MdJWJsyeqampraZUTMtLa1TrpaX2u2cYbHwqMfDnMbGlt3CKPsoHpj4ADa9BUPhs9Qk1vOnT8sIxTp3iBsqOALvyLNwrH4Z38pP1chfFZV2UMW/D9Bs6ulJ4ZdS8lXNV1y59Eq+rv2aMwvO5IkDn+DorKPRCA1bG8I8VNaAuT7BoxnpXDQ5C41UyPr2NgwN66k98n6i6fu39OdwONocR6vV4nQ69/gA0AnBX9PS+LXVygs+H496PC3v5ZnzeGDCA2SbsrAV/YuN3k3M+qKchNI5Ia8/8Ebi1nxSF9xL0NfYqWtUVAYbqvjvY3rDxu+Oupm9ZjaPbXiMopQiHp30KBcOvRCT1gTAiqog135QQvHKKK/kZXPc0CZhT/vpMSzlX1M/9WaCBUcCO1I6d5RH3+FwdGr1rxGCu51OzrFYeN3vp76VS2uqIZVZ42aRarCTOuwlfqzZwnOLazt1v1KfQt1BN2PwbCX6zWPq6l9FpQ1U8d+HxONxysvLe1T4F9Uv4pql17DMvYyLh17MfePvo8iyI3p6bqmX35RWY7PpeOrUoUzKTgHAtuFdUte8gmf0eXhHn7tTn3vKoSOE6LT5RwjBn9PSeD8nh3Ttzq6d6cZ0Zo2bRYpOj3P4P3lrzRa+2eLt1H2HCo4gUHg0jp+fIli1oVPXqKgMJlTx30dEo1HKy8t7LIArrsT555Z/MnvNbLJMWTwy+RFOKzgNrdghsF9s8XCju55glpYbp+eRY2tyjTRVLSZj0RyCeYdSP+UPO/Vrs9nQavfsf9/ZdtBkAmry+5c80tjIgnC45b1ccy73jLsHrTaKc+ir/PWbEkobO1fEvX7qH5uSiHx2u7r6V1HZBVX89wGRSITKysoei0Stj9Rz58o7+W/Ffzkx90Tun3A/hSk759X/bIOHm6rqCDu13J+ezhSbGQC9t4Tsr/9IzF5EzZH3g2ZHBpDmg97OIIQgIyOjS3l2QlIyNxTimro6trY6/yi2FPOHUTcS11WgzX6buz8v79QBcNyaR+O432HZ9jnBlf/r9DxUVAYDqvj3MoFAoEeFf4t/Czf9fBOb/Zu5cdSNXD7icgyanf3kP9/o4c4NtfgK9fzOauNMe5N7pibcSM6X14BGS/WxjyMNO1fIMplM6HSdTwdlNpu7FGhl0Wh4LjMTLXCZy4W31Wc0NX0qvyr+FVh/pkrzGU8vrOlUn41jf0PMVoj+q7uRiX1bA0FFpS+hin8v0tjYSG1tbY+ZIBbXL+a25bchEDww4QGOyjpqtzZfbvJw//xKIiMNTDEYuMW5fSWfiJI9/0a0gRqqj36YuC1/p+uEEDidzi7NRwhBenp6l1b/hTodT2ZkUBaPc01dHfFWn9VZBWdxeMbhGLPm8nHpYhaW+vfcodZAw6RrMDRuJvzjy12av4rKQEYV/15ASkltbS1ut7vHhP+jyo+YvWY2+Sn5/G3S3xhqHbpbm/lbvMyZV8mE3BQ+Lc7n8YwMtEKAlGQuvA9z7TJch91DJGvibtfqdDpMJlOX52UymbqcZmGqycSf09JYFA6zvFW6CCEE1468lkJzAZb8//Dgd+s6FQAWGHI84fQx6L99ABlTA79UVEAV/x6nOTNnIBDoMeF/u+xtnt38LFPTpjJ7/GzSDGm7tVlc5mf2VxVkjjBzz/QCcgw6srebcFJXPItt84c0TLicwNATd7t2b1b9ra/t6uof4Gyrlc/z8jjQuHOhF6PWyM3734xWFyGS9iYPf1u5589VCBomX4cuUE10wZNdvQUVlQGJKv49SCgUory8nGg02iPCL6Xk5a0v88q2Vzgq8yhu2f+WFt/91qyqDnL3Z+U4ioz8OFzDK6Ed5hLrpvdJW/40vuGn0Dj+sjbHEUJg2Z6DZ2/oqu2/mcLtD6dPgkE2tToALrIUcdnwS9FaNrLI+xFfbd6z+2c49yCCuYeg++ExZEgN/FJRUcW/B5BSUldXR3V1dY8d7EopeWHLC7xT/g4zcmZw/ajr0Wl2P4zdXB/mtk/LSLPrqRljpFCn47e2poNcc8X3ZP7wZ4K5B+M6+E5oY3UuhOh00FZH7M3qH8CnKNzV0MCVLhf+Vp/l9JzpHJp+KMbMz/j70h87Zf5pmHwt2oiH2NcPdXkeKioDDVX8k0w0GqWsrAyfz9djZh4pJa9se4UPKz/klLxTuGLEFWjE7n/Kal+MWz8pw6zXkH+kg0olwV/T0kjRaDDUrSb76z8STR1OzVEPgrb9lXkyKmPt7erfptHwWEYGW+Nx7mxoaPlMhRBcNfIqnIY0Ehlv8Pj3ZXvoCaLpo/EXT0e39HlksKHLc1FRGUio4p8kFEWhvr6+JVVDTwYVvVX2Fu+Uv8PMnJn8btjv2lxRe8MJbvuklHBc4fwTsnknEuRCm42pJhN69yZyv7iKhNFB9XF/Rxraz8RpNps7Hay1J/Z29X+oycR1DgcfBIO8GQi0vG7VWblh1LVoDHV873uLxWV79v5xj7sETSxI/Lu/d3keKioDCVX8u4mUkkAgQGlpKV6vt8cjST+o+IDXSl7jmKxj+P2I37cpptG4wp2flVHpjfHn6QWMSjVxgtnMHxwOdN4Scj+/HKnVUzX9GRIpWe2O1WzySRZdjRNozZV2O0eYTMxqaKCyVTqMCc4JzMw5CUPaAh5c/O0eg79izv0IFB2LdslzEPZ02FZFZSCjin83CIfDVFRUUFtbi6IoPS7839R+wwtbXuCQ9EO4ZuQ1bZp6FCl5YH4VK6tD3HpMHhPzLIwxGHg6MxN7sJq8zy5HyARVJzxN3FbYxig70Gq1e+Xe2R576/kDTUngHkpP54H0dPJ2eYBcPOwi0vU5hFPf5NnFpXvsyz3uEjRRH/EfnuryPFRUBgqq+HcRKSWhUIjKykqqqqp6zJNnV1Y1ruKxDY8xxj6GG0ffuFOOntb8c4mLeVu8XHZQFs4CI7c3NOBTFPSebeR9ejEiHqDq+KeIpQ7vcLxkHfTuitls3uvVf7pWy6nbvY4qWpnWjFojN4+5AY3Bw9yG19hUF+6oG6Lp+xPMPxzNoqcg0olAMRWVAYgq/p1EURT8fj/l5eVUV1cTDod7LVlYaaCU2Wtnk2PK4U9j/rRbuoZm5m5o5LVl9Zw0OpUzxzv5U0MD80MhDO6N5M29GJQYVdOfI5o+ulPj2my2PTfqIl3J+Nkea6JRTqiq4g3/DuEebR/NSTmnok9dzJyFX6Ps4W/jHn8pmnAjicXP7fU8VFT6M6r4d4CUkkgkgsvloqSkBJfLRSwW69UMkY3RRmatnoVBGLj7gLux6dsW5OWVAR76porJ+Slcf3gOz/t8rI/FmCMaGPnZJUiNkaqZLxJNG9WpcS0WS4c5+7tDSkpKtw6RR+v1HGQ08me3m7WtIoAvGvZLHNpsas1v8N811R32EckcTzB3GuKHJyDeuSyhKioDCVX8d6HZrNMs+JWVlS1um72dFjimxJizdg6emIc7xt5Blqntw9lKb5S7P68gz27gnuMLKEvE+bvHwymJei788mIS5gwqZr5IzN65gubNBVt6iu6u/jVC8Lf0dFK1Wq6pq2vx/zdqjdwy5jo0+kZe2vIK7lDHvv+esRehCbpQVvxnr+ahotKfGfTirygKoVAIt9tNeXk5W7dupbq6Gp/P1yuHuO0hpeSJjU+wzruO60dezwjbiDbbBaIJbp9bhkTylxmFWI1aZrsbMCtRnln0B4J5h1Bx0sskrLmdHlur1WLcJa1CsunuziJDq+WR9HRKdvH/H5s6lqMyZiBSF/DgwgUd9hHKnUbEORL53WOg5vtXGWTs3clbP0NKiaIoxGIx4vE40WiUSCRCNBolkUgghEDGIxgb1mF3rcTg3YouUI3OX4Um4kEocYSMA4KE0Y5isJMwpRGzFRKzDyHmGEokfX8UY/LcIt8rf495tfM4v+h8Dss8rM02CUXyl68qKWuM8teTish3GDDUr+Xpnx5hczyOadSZ1Ey4AjSdN7E0r/qTfdDb1jhpaWnU1dXt9QP24O3+/x5FQQGa7/KKURex+PsfWZl4maUVEzgwv50aBELgGfNrshbcidz4OWLk9L2ah4pKf2RAin8sFqO+vp54PE4ikWipltUsaM1iow1UYy/9Ckvpl5hcKxFKU/6YhDGVuDWXmKOYhNGJ1OiQGh1CKmiiXjQRL7pQHSbXcjSxHUFHMVshkfSxhLInE86ZQsxe3GbKhD2xtGEpL297mcMzDufconPbbff84loWlvq57vAcJufoSVn2FFmrXkAxObEdfAfuwt1TOu8JKWWPHPS2hdVqpb6+vlu7q6vaeFCZtWZu3P8a/rL2Hh5c8TKv5l6DTtP238FfPIO0ZX+Hbx9Bp4q/yiBiQIp/JBIhFArtJipSSkjEsJR+gX39W5hrlwEQTR2BZ/8LCGeOJ5JxQIeBT7t0iDZcj75xM8b6NRjrVmOqWYp126cAxE3phHIPIpQ7jVDuNBKWnD12WRmq5KF1D1FsKebakde2uwL/YqOHf69o4Mz9LfxK+wWp/32RK/PPovSgR3lqyDgw7d0upLuHsV2hOVtoQyuzzd70AbA8EuEhj4cnMzKwajQclDGJcZajWCHn8fzyw7l80uS2O9Dq8Yy+gPSfHoXKZZA3aW9vR0WlXzEgxb8tNBEvjrWvY9vwNrpwPTFbIQ2TriYw5PhOH4TuhhAkzBkkzBmEc6c1vSYlOl8Z5polmKqXYK5ajG3rJwBEbUWEcw8ilHsQ4axJJMwZO3UXjAeZvWY2GqHhtjG3YdS2bXdf7wrx+jcruNu5lF/VzEW/tZqvik7m+bzpXGKz7bXwJzuitzPYbLak1DmISMnCcJjbGhp4fHsg2S3jLuWi75fxcf1znOZ/mFyruc1rvSPPxLnyOeS3j6I991/dmoeKSn9hwIu/JurDseY1HGtfQxPzEyg4EteocwnlHQxtRMh2GyGI24vw2Yvw7XcmSIm+cTMpVQsxVS3GuuVj7BveBiBmLSCcOZ6ocyRhx1Dud39BRbCCe8fdS7Ype0efUqILVGFwbyBRs5aCNfOYr98IIQhnTqTykLu4XAwhT0qu64Z4CyGSGtHbGTQaDampqd1+ABxkMvGH1FT+2tjIZIOB39rt2PQ2fjfsMp7Z9jdm/fgaTx1zSZvXSoMN74jTcax7EzwV4Mhvs52KykBi4Iq/Ese+/m2cPz+FNuohUHQs7gm/J+oc2bvzEIKYcwQe5wg8Y34FSgxj/RpMtcsxulZgrv4R29aPedZh54e0VP5Y7+bUj36Psr1+roiH0MRDCNl0bqEgaJRD2DD6CkxjTiJuK+Bpj4eNHg/PZmSQ0g0Pmt446G1v3MbGxm6v/i+z2VgWiXB/YyPjDAammEycVHgEH5XNp0z5mI82H87Jw9sOcPOOPg/H2tdJLH4e7Ql3d2seKir9AbGvXBn3xJQpU+SSJUv26trQmk/RfnY7hsZNhHIOov7AGzod1bov+KnmG2ZteJjjTEO5wzgWbdSLJuoFBFKfgqIzE0/J4uXSDF7Y6uTGY4dx7IimFX5MSmZUVTFKr+epzMxuzaOoqGivUy90l8bGxqSYf3yKwunV1Uw0GHgoo8ms5go1cOmiqxGJNF478hFS2kktnT3vBsyuFWj+sBb0vbsDUlFJFkKIpVLKKXtqN/BW/nWbMP/nXGLWPKqPfohg4TF75XHTW1SFqvjb5qcpthRz2YT78bRj5//fWjd/31rNeRPSW4QfQC8E7+fkEOmmaBqNxn0m/NC0+ne73d3ux6bR8FpWFpmtDq0zzWmclXcxb9f8nVlL3uD+Q37T5rWe0edjKZuPsvItNJN/3e25qKj0ZQZekFfGCEKnv0jFae8SLDq2Twt/KBFizpo5ezzgXV0T5PEF1UwpsPC7qTtW9xtjMaJSYtNoyOiGh86+OOjdlWbbfzLMTjk6HVohqE0keMHbVOLxV/sdR5oykTXR91lUtbnN68I5U4mmjkD+8KQa9KUy4EmK+AshZgoh1gshNgkhbm3j/YuEEC4hxM/b/2v75C1JJEbMQOr69rZdkQqPrn+UsmAZN42+aecD3lbUB2Pc83kFmRY9dxybj3a7v7pXUfh1TQ0319cnZT4pKSlJ6ac7JPsB9Jbfz+zGRl73+RBCcPekaxDSwN/WPUZMaSP1gxB4Rp+P1rUGWdJxdLCKSn+n2+IvhNACTwAnAmOA84UQY9po+m8p5cTt/z3f3XH7O/8u/TcL6xfy22G/ZaJzYpttogmFuz+vIBBN8OcZBdhNO1b3DzY2Uq8oXJyEgKyeTOLWFZK5+ge43G7nGJOJe91uFofDFNszOMF5EVFdCX/56dU2r/EPO5GEwU7i+yeSMoeu0pxbyu12U1lZybZt29i2bRslJSWUlpZSW1uL3+9vCVxUUdlbkvGLPwjYJKXcIqWMAm8CpyWh3wHL93Xf82bpmxybdSyn5J3Sbrt/LKhhTU2Im4/OY1jajp3MknCY1/1+LrLZGN/NHDw9ncStqyRz9a8VgkcyMhii03FFXR1bYzGuGj8dW3QKPwXfZ1HN2t2ukTozvv3ORLvxU2jcc13gZJFIJHC73ZSUlFBdXY3b7SYcDqMoCoqikEgkiMfj+P3+lqSD1dXVxGKxXpujysAiGeKfD7T+lZRvf21XzhJCrBBCvC2E6LiE1ABmi38Lj61/jJG2kVyx3xXtrnL/t9bN/9Y1cv7EdI4etkOco1Jyh9tNnlbL9UkQyt5I4tYVNBoNTqczaat/m0bDc5mZaIDZbjdCCGZNvhriNv627mHC8d0Lv3hHnQ1Skljc8xvU5trPpaWlNDY2diqZYPP7wWCQ8vJyamtr1Z2ASpdJhvi39Svd9dv7IVAspRwPfAG0GUYphLhMCLFECLHE5XIlYWp9C1fExazVs7Dqrdw25rZ2i7Ksqm464J1aYOHiKTu7b9YlEuiBWWlpWLppqumtJG5dJdlzGqLX86+sLP623fVzmNPJDOdlRDW1/PnnZ3ZrH7fmESw4ArHs5R7N9b9r7ee9cXOVUuL3+ykrKyMc7riCmYpKa5Ih/uVA65V8AVDZuoGUsl5K2fwreg44sK2OpJTPSimnSCmnZHbTZ72vEYgH+POqPxNJRLhr7F2kGdLabOcKxLj783KyrXruOG7HAW8zeTod/83J4Rhz26kKuoKUEqvV2u1+kk2yV/8AYwwGHBoNESn5p9fLpeMPxRY6hlWhr/i0/Nvd2ntHnYsm1ICy6r2kzaEZRVGoqalJau1nRVGoqqrC4/HsszTkKv2LZIj/j8B+QoihQggDcB7wQesGQojWyeRPBXY3tg5gYkqMv679K+Whcm7Z/xaGWNrOJRSNK9z1WTnhuGTW9EJsxh0HvAkp+YfHg0dR0CZJFE0m0z717e9452XxAAAgAElEQVQIu93eI4fQXwSD3NfYyD2Nbu6bcglKuJBntjxBVWjnyl+hvIOJ2YtQFu2+M+gOsViM8vJygsFg0kVaSklDQ0O3M6WqDA66/euSUsaBq4G5NIn6f6SUq4UQs4QQp25vdq0QYrUQYjlwLXBRd8ftLyRkgkfWP8LPjT9z5Ygr2/XskVLyyHfVrHeFue2YPIam7WyHf8nn4xGPh+9CoaTMqy/49neEEIL07QnaksnJFgtX2O38OxDgP5o4F+RdS0KR3L7sfmJKq8NTocEz8hx0VT8hK5clZexmG328VfH5ZCOlxOfzJSVgTmVgk5SllZTyYynlSCnlcCnlX7a/dpeU8oPt/3+blHKslHKClPIYKeW6ZIzb11GkwuMbHmdB3QIuHnYxx+cc327bt1c2MHeDh99MzuDw4p3dN7fFYjzs8XCc2cxJSfTH7wu+/R1hsVh6ZGfyB4eDC6xWnvF6cRdkUxz/NfWJrTy+9sWd2vlHnIqiMxH//uluj+nxeKipqemVFbmUEo/HQ0NDQ4+PpdJ/2ffO3QMUKSVPb3qa+bXz+eWQX3Jafvverz+W+XlmUS1HFNv4zYE7p3lWpOS2hgZ0wKwk2sGtVmufO+jdFSEEmZmZSZ+nEIJ7nE5OSUnheZ+P6w85AeE9nG8aPmZuxZct7RSDDf/Qk9GufQ+CeyekUkrq6+u7VbNgb8f1eDx4t0c4q6jsiir+PUBcifP4hseZWz2XXxT+grMLz263bVljhFlfVlDsNHLrMXlodhG6l/1+Fkci3Ol0kpOkVXBf8+3vCJPJhDkJh9u7ot1eBP7d7GyGWYzcPuEyEoFhPLX5SdZ717e08446G00iQuzHruf5l1LicrlavHl6m+YHTyTScx5LKv0XVfyTTDgRZvaa2XxV+xXnF53Pr4b8qt2Vqz+S4I655eg0gvtmFGDW7/7nmGE2c73DwVkWS9LmqNVqMRjadjPti/SE7R9AJwTF2zN8LrRBZvH1xGN27lrxF+ojTWkzommjCGdORCx9ERSl031LKampqSEQCOzTw1cpJVVVVWocgMpuqOKfRNxRN3esuINl7mVcNeIqzhtyXruiFVck935RQZUvyj0nFJBj21mM41KiSEmuTsc1DkfSxK+v+vZ3hF6v79E5SympjMf5JkUQybqFYCLCHT/fRzjR5DfvGX0OOm8piY2fd7q/6urqNkuJ7gsURaG6urpPzEWl76CKf5L4yf0T1/10HSXBEm4dcyvTc9svBi6l5O8LqllaEeDGI3KZkLv7wevjHg8XuVzdTtXc1th90bd/TyTb7781Qghmp6Vxhd3OFkcKVWl3UBYt567ls4kpMQJFxxM3pZP4Yc8Hv80r7XA43KfENhqNqh5AKjuhin83iSkxXtr6EveuupdUfSoPTXyIaenTOrzmnVVuPlzblLph5qjU3d5fFA7zlNdLtlaLMcmC15d9+ztCo9GQlZXVow+Am1JTucfppNHhoDTtLtYFVnD/6kdRNFp8+52Bfts8lPqt7fbRLPyRSKRPCT/sOACORqP7eioqfQRV/PcSKSULXAu4eunVvFf+HjNzZvLgxAcpshR1eN1323w8vbCGw4ttO+Xmb6YhkeDG+nqKdDrudjqTOue+7tu/J1JSUnrk8Lc1v7bZeCIjgyszC9E0zGRJ43f8Y/1zePY7E4Qg+kPbQV99WfibaT6H6KvzU+ld+t8ScB+TkAl+aviJt8reYr1vPUNShnD3AXcz2Tl5j9eurgly35cVjMwwcVsbnj1SSm6pr6chkeDtnBysPRDh2td9+/dERkYGZWVlPSpgM1JSICWFYw+9kEvXpvJWqIR42fvMKTyKlJVvIGfcjdDveAj1B+FvJh6P4/F4SE3dfcepMrhQxb8TxJU4WwJbWFS/iC9rvsQddeM0OLlqv6s4Lvs4tGLPVbTKGiPc/mk5mRYds2cWtunZU5NIsDYW41ank7E94I3TH3z794ROpyM9Pb1XUhiMzDRTED6ahTLKK4GfCFpqeS7SiH/hv7AcdhkajaZfCT80PajcbjcWiwV9O7WMVQYHg1L8Y0qMYDxIVEZRpEJciROTMSKJCOFEGG/ciyvioi5SR0mghA2+DUSVKBo0TE6bzPHZxzM1bSo6Tec+vvpgjFs/KUMj4P6Tikg1t31djk7HJ7m5WHtAoPuTb/+esNlsBINBgsFgj4/1ckE2f61p4Hk5kVeNxfiHNjJ7/gf88qaLeOMNBZOpsd8IfzNSSmpra8nPbyvzuspgYcCKvyIVNvs2s8KzgrJgGdWhaqrD1XhjXuKyjRJ+bWDRWsg15zI9Zzr72/dnrGMsTkPX7PCecJybPyrDHYrz0P8NId+++4q+Oh7nNb+fax0ObD1UUauv5e3vDkIIsrKyKCsr63H/da0Q3JaTzlE+M5fWhHir6FqWvORh249G7rrLx6xZPZNGWZGSck+UEneEal+MKl8MfySBIpvKCxt1gnyHgXyHgaFOI0Wphi7t6qLRKMFgsN+bAVX2HtFXVyxTpkyRS5Ys6fJ1rqCL2T/MZlH1InxxHwBphjRyTbnkmHNI1adi1poxa80YtAa0QotWaDFoDBg1RkxaE1adlQxjBhZd9wKrAtEEN31UypaGCHNmFjI5f/f+IlJyQU0NG2Mx3s/JYWgPbMWFEDidzgFn5w2Hw1RVVfXaqnv/McVEI7s/nI1GhTVrtnWr70hcYXVNiOVVQdbUhFjnChGI7ggqs+g12E1atBqBoOm71RDa8eDLtek5rNjGkUNtjM02d+pBoNVqKSoq6vemQJWdEUIslVJO2VO7AbfytxvtrHWvZUraFCY6JzIxdSKpht4XvXBc4Y655WysCzNrekGbwi+l5J6GBn6ORnkyI6NHhL95HFsSav32NUwmE06nE7fb3SsPgK/nlzFnThpzPzUQiRrBmEB3cBXnX1SDJ2zDYer8zykcV1izXeyXVwVZWxMipkg0AoalGTl2uJ3RWWaGpxnJsRmwGTW7iXQoplDpjbKmJsSCEh/vr3bz9soGxuWYufDATCblpXQo7Iqi4PV6+7UHmMreM+DE36g18vbMt3G5XPvMDhuMJrh9bjkrqoL86dg8Dh3StvA+6/Pxn0CAK+32Jg+THsJsNqPV7vlQuj/icDiIRqO9kkYhKyuB1SqJxgwYdWEiUQNxe5yXhnh5Z1k9kxq0HOg0MzrTTKpZi1mvwajV4IsmaAjGqQvE2doQYWNdmJLGCIoEjYD9MkyccYCTiXkWxuWYsRg697cy6zUMTzcxPN3EKWOcBKMJ5m7w8Mbyem76qJRxOWZuOCKXYmfb5r7m/P9Wq3XAfj9U2mfAmX2AliLX++Le/JEEt35axrraELcdk8dxI9peVbkSCY6trORYs5lH0tN3c/tMFkIIsrOzB7Rtt9l/vafTKQghuPbafLKyFC7Nv4kXP5vGl9pJeG9+k3r70WgUDcXfhIlH2p9DeoqOEelGRmSYGJud0iWx7yzRuMIn6xv555I6QnGFS6Zmcta4tHa/Y3a7nYyMjDbfU+l/dNbsMyDF/7MVpQxNiaPt5RA2TzjOzR+XsbUhzJ3H5XPE0I69a9ZHoxTr9UmP4m2NRqNhyJAhA96uK6WksrKyxzJYCiHIyclpCTKLrfsU/ZvnUnvYLOba03h4yys06gu5KnMsE1Km83wowP6KjiEJDQ6jjrQUHWlmHVZj762wG4JxHvqmih9K/YzPTeGu4/JJS9l9sy+EoLCwsF9GfqvszqAV/021fk54+GvGdfBl7wlK3BH+9GkZ9cE495xQwMFFbefPWRmNsjoa5bxeyq/jcDhIT0/vlbH2Nc0JzJLpeimEQKfTkZOTs7NfvJQoTxxMLKFQ8X9vUh9t4KlNT/Fjw48MsU/km7SL8UnBWL2e86xWTrFYesyTqyOklMzd4OHxBdWkmnXMmVnIkDbMQDabjYFWN3uw0lnxH3DpHUZkWbn/9NGsd4W4/L2trK1NTtnDjlhaHuDq97cRjis8csqQdoV/dTTKhbW1POXx4OtCeuC9ZSD59ncGjUZDbm5u0jKANn9+BQUFuwdECYHm0KsxujdgrlpEujGd28fczg2jbqAhuJkhJTczI76KqFS40+1mWkUFP4R7xi10T/cwc1Qqj5wyhEhc4Zr3t7GsMrBbO7/fTzzeORdolYHBgBN/gJMPyOYfpw1FpxFc/0EJ761qQOmBHU5Ckbz5cz23fFJKlkXPE6cPZf+stnPPrI1G+U1tLRYheC07u1dWgQaDYdBFcTbX/u1OBbDm1X5ubm7HtQTGn4O0ZOJY+2rLdUdnHc2TU57kxJxjqKp4jszS2/ijdhO/SDFzwPao7f/4/dxaX8+8UIhwLywCAEZlmnni9GLSU3Tc8nEp35f4dnq/+fBXZfAwIMUfYESGiafOKGZyfgp//76Gmz8upcYf2/OFnaTaF+UPH5Xy7OJaDhti4/HThpBja1toV24XfpMQvJqVRUEv2Fb7exK37mK1WikqKurSLqBZ9DMzMyksLMRkMnV8gc6IOOgyUioWoG/c3PKyXW/n8hGX89Ckhyg0F/DJlsdwbb2TFfU/NFX3SiT4JBjkEpeLKRUV/N7l4m2/vzu32ylybAYeP62Y4ekm7v2igqXlO+8AAoEAsVjyfiMqfZsBZ/OHnb19pJR8tK6RJ3+oQSsEv52ayf/tn4phL0+DowmFD9c08s8lLgCuOSyb6ft1XGzlDb+fpzwe/pWV1WO+/LsihGDIkCFo9oGdua8Rj8fxer0Eg0Gi0ehOfyspJVqtFovF0pI1tEs7hkA98pEx+IeeiOuQu3Z7W0rJjw0/8vK2lykLljHcOpzzis5jvHMKiyMRvgqF+DIUolCn4/XsbACe8XrJ12o52GQiowdcML3hBDf+r4RKb5S/nlTEATk7PMGsVitZWVlJH1Ol9xi0B77QtqtnpTfKQ99UsawySJZVx4WTM5k+0oFW07kfelyRfL7Bw7+WuqgNxDkw38IfjszZrQJXa1yJBJnbf7wBRcHSi0Ksuu+1jZSyZXUrhECj0XTbx11+eAMse4XSsz4mYW77M0/IBPNq5vFW2VtUh6sZbh3OOYXncFD6QQgEfimxaTREpeSQigoat5uDhut0TDWZODUlhWl72ol0gYZgnOs/LMEdjPPoqUMYnt7Ut+r50/9Rxb8NP38pJUsrArzwo4v1rjCpJi2Hbg+JH5eTslumzWA0waqaEN9s8fLdNj/eSIJRmSYumZrF5Pz2oycTUvKYx8M/fT7ezs5mVC/XyxVCkJ+f36/q9PZr6jcj/zEFz9jf0DD5ug6bxpU482vntzwECswFnFV4FkdkHoFe07QrjEvJ6miUhZEIi8NhlkYiXOtwcLHdjiuRYI7bzRSjkWkmE8N0ur0+26j1x7j6/W1oheCpM4pbEg6qC4f+jSr+HQR5SSlZWOrni01eFpb6CcWaVlkWg4ZMS9MP0OWPEdj+eopewyFDrBw3ws60wo7TIrsTCW6or+fbcJizLRbuTUvrUT/+tjAYDBQUFPTqmIMd+fbvkOs+ovTMj1FMe04nkpAJFrgW8E75O2wLbCPNkMbJeSczPWc6dr19l7aSmJSYNBp+ikS40uXCtX1nkK7RMM1k4jqHgxF7YVJc7wpx3QcljM4y8+BJRei1QjUZ9nNU8e9khG80rvBTZYAtDRHqAnFcgSaTQJZFT6ZVT7HTyOT8lE6dESyNRLihrg5XIsE9aWmcuw9q5QohyMzM7Jd1evs1tWvhyYNxj78M98QrOn2ZlJKl7qV8WPEhPzf+jEFj4MjMIzkx90RG2Ea0e822eJzF23cGCyMR3sjOpkinY24wyIJwmGPMZg4xGjF1QsC/3OThL19Vcsr+qdxwRC5CCFJTU3EmuZKcSu8waBO7dRWDTsPBRTYOLup+4rPPgkEE8O/sbMbvw/TJAzmVQ58la3/k/qfgWPcGjWN+hTR07vskhGBK2hSmpE2hJFDC/yr/x9e1X/NFzRcMtw5nes50Ds88HKvOutM1Q/V6hur1nGu1IqVs2Y2WxOO8Fwjwmt+PSQiOMZk4yWLhxA4Oso8b4WBzfYQ3l9czMtPEyaOdeDweHA6HuvofwAz6lX93WRgOYxCCyUYjke3b854ov9hZVHvtPqTyZ3j2KBomXUXjuEv2uptAPMD82vnMrZpLSbAEvdBzUPpBHJ11NJOck1rOBtojIiWLw2G+CIX4NBgkTavlk9xcAMrjcfK12t0eBAlFcusnZayqDvL0mUMpTjORlpY2qN2F+yuq2aeHxb80Hud+t5u5oRDTjMYWN719iXrQu++Rr52DUrqI0jM/Quq7twOTUrLJv4l5NfP4xvUNvrgPs9bM1LSpHJJxCBNTJ5Ki63iMhJTUJBLk6XQEFIVDKirI0+n4rc3G6RbLTudR9cEYl769lbQUHU+eXozZqFfz/fdDVPHvIfGvjMd5zuvlTb8frRBcbrdzic3WKdtqT2M0GtXSfPua8iXw/HHdXv3vSkyJsaJxBd/Xfc+i+qZCRVqhZYx9DJOdkxmXOo5h1mEd1pOOSMl/AwFe8/lYHYuRqdHwW7udX1mtLW7IC0v9/OnTMs4Y6+Taw3MHfEbYgYgq/kkWf0VKNELwjt/PnxoaOMNi4XqHg5w+4g/dXNrQYule9TGVJPDmL1E2z6P09A9QzGlJ7z4hE6zzrmNpw1KWNCyhJFgCgFlrZn/7/oyyjWKUfRT72fbb6aygGSkl30ciPOv18l04zLvZ2UxodUb1xPc1vLOqgb/MKOCYUZnk5eUl/R5Ueg5V/JMg/iFF4ZNgkH8HAhxrNvN7u52YlNQmEuT3EdFvZrCkbu4X1G1EPjEN76izqT/olh4fzh11s8qzilWNq1jjXUNZsAxJ03c/15TLCNsIhluHM9w6nGHWYTs9ELbGYi1R5//weJhkNDJVb+DK97bhCSd46ZzhjB4+ZNDliOrPqN4+3eDTYJD/BQLMD4cJSckQnY707dtivRB9Tvib8/iowt9HyNgPceBF2H/6F57R5xG3D+nR4ZwGJ0dkHsERmUcAEIwH2ejbyHrfejb7N7POu45vXd+2tM8x5TDSNpKRtpGMto8moRtGHA0fBAI84vHwC4uFK47M5pb3S3nyh2pmpTs6ne5ZSkkikUBRFHQ6neot1IfpWyq2D/ApCiuiUTbFYly4vc7tW34/q6NRzrRYOCklhWlGY58X1sGUurlfcPStsPxN0pf9g5qjHuzVoVN0KUxwTmCCc0LLa56ohy2BLWz2b2aTbxOrPav5xvVNU3ttCgc4DuAKx0RWpEzktUCArzUhjp6ayieLGzlmeDW/SE9vU8illIRCIXw+H6FQCEVRWn4rzXmTDAYDDoej63mTVHqUpIi/EGIm8BigBZ6XUt6/y/tG4GXgQKAeOFdKuS0ZY3eWiJToAY0QfBsK8V4gwKpolM3bc5jrgDMsFuwaDQ+mp+PQaND2ky9qSkqKWoO1r2HNQhx2LZb5czC5fiacOXGfTsdhcDDJMIlJzkktr7kiLtZ61rLSs5IVjStY3LAYgCMdh7Iu9TQ+TEthQrqBh76pYkRqHjdck86//w05OU2FczweD42NjQA7mVhb/38ikSAUChEOh9FqtaSlpWGxWNSHQB+g2zZ/IYQW2ACcAJQDPwLnSynXtGpzJTBeSnm5EOI84Awp5bkd9dsdm/+C2lpeKCujJpGgNpGgPB6nJpHg09xcRuj1vObz8aTXyxi9nglGIxMMBiYYjdj74RZVCEFeXh7GfRhUptIOET/yiYOIaUyUn/wGaPu23bwqVMUPdT+woG4BGwIlRIxDmKbLZOGqiZi/OZ0183K56KIIDz8cprGxsSVrblcQQmA0GsnJyVFNQj1Erx34CiEOAe6RUs7Y/u/bAKSUc1q1mbu9zQ9CCB1QDWTKDgbvjvi/UVbGJVu2kKXVkqXVkq/TUajVcq7VSo5Ot1NEZH9HzePTx9kwF14/B/fEK3CPv2xfz6bTVIYq+aTqE+acdBcytvvCwqQL450zmYQ5nUjaaKJpownlTCVu69x3UavVkpubq8ak9AC9eeCbD5S1+nc5MK29NlLKuBDCA6QDda0bCSEuAy4DKCoq2usJ/V9qKquKitpdlQwU4RdCqPlX+jojZyAP+AWpK57DX3QcsdTh+3pGe0QbqGbMlk+YUv4dF183iTPnP8KKlcdBRIfWEGHm5IU8ev6bhFMnovNXYtvyEZr1/0EiCOUfhmf0eYTyDgHR/so+kUhQUVGhxhHsQ5Ih/m0p6a6q25k2SCmfBZ6FppX/Xk9ogIj7ntBoNOoPpx8gTnwAufkrMn+YReXMf3YoivsMJY6lbB62jf/FXPkDAkkkfX/SDj6RCZv3Y+VSLdKQIBEz8LU9zrsThnJGwRlNQWVSQe8rw7rlE2wb3ib3y6uJOEfiOmwW0bRR7Q4ppaSmpobc3Nw9V01TSTrJ+BaWA4Wt/l0AVLbXZrvZxwGoBUO7QXPmxcHyoOvXWDIQM+dgcq0gdc3L+3o2OyFiIexrX6fwv6eR/fXNGBq30Dj+EkrP+JCKk1+ncfLV1IXzuPDCENOuW4p2Rjn+4DieL/+UP/78R7YFtoHQELMPwT3xckrP+oTaw/6MNlRP/se/wrHyRVAS7Y4vpaSqqopoNNp7N60CJMfmr6PpwPc4oIKmA98LpJSrW7W5ChjX6sD3TCnlOR312xeCvPoyas71foaUyP9cCOs+pPq4JwjlHbxPpyNiQRzr3sCx+hW0UQ/hzIk0jv0NwYIjQdPkOdZsVnQ4HEgp+fKnDVz6382MnWTnvIJtPLP5GUKJEFftdxVHZx29U/+asJuMhX/BWvoloewDqT7mUaSh/TTjGo2GgoICtYJYEuiszb/byiGljANXA3OBtcB/pJSrhRCzhBCnbm/2ApAuhNgE3Ajc2t1xBzt2u10V/v6EEIjTn0SmjyTr29vQ+XfdHPfSNOIhHKv+RdG7J5O27B9EMsdRMfOfVJ74T4JFx+wk/Dk5OS27S41GwxEHFHPKfk7WLfFSpJ/C7w54GIvzBB5Z/wjPbHqGmLKj+LticlJ71IPUHnYvptrl5H5xJZqor915KYpCdXX1gF6w9TXU9A79ELXOaj+mfjPKM0cRs+ZTOfOfSF0v2bqVOLZNH+Bc/jS6kItg3qG4J1xOJHPcbk01Gg15eXlteuKsL6ni9Od/ZlKemZKJRpZGI5wf+5ElFS8zxj6G28fcjlW/8wo/pXQe2d/cTMQ5kurjn0Ixth2QKITAbreTnp6enHsepPTayl+l97FYLKrw91fShyPOeh5Dw3qyv/4jIh7u2fGkJKXkSwo+PIfMhX8mbs2lcsbzVB//xG7CL4RAr9dTUFDQrgvmfoXZXDAxne9LAlwaTyFbq+MDwzR+vd8tbPBt4LYVt1EX2cmJj2DRMdQc/RBG90Zyv7gcEQ+1M1WJ1+slHO7hz0QFUMW/36G6d/Z/xKiZJE78G+aKBeR8eQ0iFuiRcUzVP5L3yW/I+fomAKqPfpjKmS8Rzj5w9zkJgclkIj8/v8OFhUaj4aJDhpBl0fHaojpeyMhAAk8pxdww5h5cERe3LL+FsmDZTtcFC46k5qgHMdSvI2PhbOigvnZ1dTWJRPuHxCrJQRX/fkZKSoqaYXEAoJt2CbFTnsBUu4zczy9HE/EkrW9TzVJyP/s9eZ9dhi7ownXI3ZSf8p8mm34b3mFCCKxWa6ejbrPSU7nkoCw21oXZtC3E05mZVMbjLNQUMnv8bOJKnD8t/xMlgZKdrgsWHoV7wu+xbfkfto3vttu/oijU19d3/cZVuoQq/v0IIQRpacnPD6+ybzAc+EuCpzyDsWE9BR+cTUrpV3vfmVQwV3xH7txLyZt7CfrGzdRPuZGy0/+Lb7/TQdP2ar55J5mZmdlpt2Gj0ciM/dMZmWHixSW1jNfpeScnhxscDoZZhzFnwhy0Gi13rrxztx1A4/hLCeYdSsbiBzDUrW5nBAgEAoPa/BMIBHr8zFIV/36E2WxWV/0DDMvks3Gf+W8SJic58/9A9rwb0fnK9nzhdjThBuxrXqPwv6eT++U16L3bqJtyE2VnfohnzK87PFAWQpCdnU1qamqX553qcHDptCxq/XH+t7aRMQYDWiGojsfZKtK4b9x9CAR3rriTimBFq0E11B5+H3FzetOZR9TfZv9SygHttNERkUiEmpqaHr931dunn6DW5x24SCmprijDuOwFUn9+Gk0iTDhjHP6hMwnnTCFhSidhTAUUdIFqdP5KTHWrSCn/BqNrJQJJOHMCntHnEig6vlMJ5LqbW0dRFLZt28aNH5ZQ0hjh1fNGYNZr+L3LxQ/hMO/l5KCPVnHHyjvQCR0PTHyATOOOmgBG13LyPvkt3tHnUX/QzW2O0bzTHWxF5Gtra/H7/RQXF++VO7dayWuAiX9KSgo5OTn7ehoqPURzqoNo3TYsm/+HddtcjO4NO97fnhJCSKXltXD6WIIFRxAsPLrDNAqtaT7YzcrK6nYa8JqaGhZtdnHtByVcMjWTCyZlUBWPc2p1NelaLf/NzqY6VMpty28j3ZjOnPFzsOltLdenL7of+4a3qDjxZaIZY9udb1FR0aBJWa4oCiUlJUgpVfHfGwaa+AshKCgoUE0+AxwpJbW1tQSDQaSU6D1bMbg3oQ3Xow3VgxDErPnErfnEHENJmLvmD986YjcZaUHC4TBVVVXc9kkpq6qDvHb+CGxGLd+GQlzkcnGRzcadTicrG1dyz6p7GGkbyT0H3INR25QlVER9FL5/JglzJhUnvdzuuYTNZut0JbH+jtfrpb6+vlfEX7X59wMsFosq/IMAIQRZWVkt4hxzDCVQfALe0efhnnQV7olX4h9xWpMpqAvCL4RAp9ORl5eX1HxQRqMRjUbD76Zm4o8q/Ht5k4fOEWYzF1qtvOTzsSAcZlzqOG4YdQNrvWt5eP3D/H979x3fdnU1fvxztGVrW97xyiI7lB1m2GEXCIQVCPwoT1knF6QAACAASURBVB8KD7RsKKXjRaFA6VNogDLL6kMDJWWVQhgpqwQCGcQkcXacacd2LC9ZsnR/f9hynFhyhi3Jse/79cortvWVvldNObq+99xzIqo9jVNZnNQceivW2qW4lv0t4X0aGxsJh8MJHx9I6uvrUzZp1cG/n9MZPoNL7N87Pz+/T5Y6YrP9oqKiPm/4EzuRO9xv5/hhLl5fUkt9sL0z3q0eDz9yOhnXsadwdPbRXDX0Kr6s+ZKX1r7U+RpNJSfRXHg0voUzMTZXxb2PUora2oFfB7K1tZW2js6CqaCDfz8W+49Ln+YdfGw2G0VFRTidTkRkr2brseudTidFRUVJrf7qdDpRSnH5QX5a2xSzFrcHaZvBwO1eL26DgUhHx6+zCs7i1LxTeX3D63y09aPYYNl22K1IJIx38VMJ79Pc3DzgK3+mctYPOvj3e/uShqcNDAaDgezsbIqLizuXghJ9EMR+ZjKZ8Hg8FBcXk52dnfSJg8lkwmazUeK1Mnmoi3+U13XO/gGqIhHO3bKFd1taEBGuGXYN493jmbliJksDSwFocxYRGHEuzhX/SJjmqpQa0Ae/otEoTU3JOemdiA7+/VTs1/XBkuWgJRZrfF5aWkphYSF+vx+Xy4XT6cTlcuHxeMjJyaGkpITi4uKU//8m9sF02UF+guEory3esUTjMxgQEX5ZW8v2SASTwcSto2/Fb/Vz3/f3ddYB2j7hRyiDCe/CxxPeJxgM0tramvT3kw6pDvygg3+/ZTQaB11+s9YzEcFiseB0OvH7/WRnZ+P3+/H5fGRmZqZtohDrJlfms3LcUCevd5n9m0S43+ejPhrl3u3bAXCZXfx87M8JRUPcv/R+wtEwkYxsAqMuwrHmX1i6pLh2NZDX/lO95AM6+PdLIrJXx+01LZ1i+wsA0w/y0xKO8tp3O4L0aIuFa1wuXm9q4tOW9oqeRRlF3DDyBlY0rOCpVe1r/dvHXUnUnIl3wcyE9woGgwNu7T8UCqUlm0kH/37Ibrdjt9vTPQxN22Oxjekyn41jy5zMXlJHY+uOypzXud0MNZl4pmFHQ5dJ/klMLZrKe1ve4/0t7xO1uqgfN4PMjpPL8SilqKurS/r7SaWGhoa0nEnSwb+fERH8fn+6h6Fpe8VqtXYuO132Az/N4Sj/KN8RpK0iPJeTw5O7HNa6pOQSDvQcyJ9X/pmVDSupH3UxEYsLT/lfEt6rubk5pSmRyaSUoqEhcYezZNLBvx+JbfLq1E5tfxTb+B3ut3F4USZ/X1JLsG1HOYohJhMWEZqiUbZ2BG+jGLlp1E14LB4eWPYADRIlMGoaGes/xly/Ju59BtLsP3aaOx108O9HTCaT3uTV9lsOh6MzkF36Az/1wQj/XLZ9p2uiSnH+1q3cVlvbea3L7OKWUbewrXUbj1Y8yvYDpqGMVtzlzye8V2Nj44Bo+JKOjd4YHfz7iVh5Xb3Jq+2vjEZj517VuLwMJuRn8LdFNYQjO4KbQYSLHQ4+DQZ5r2VHO8dRrlFcUXYFX9Z8yRu1n9Mw/Bycq9/B2LQ14f22b9+e8LH9QVtbW1p7Fujg3w+ICG63W5dr1vZ7LpercwJz6YFZVDe18cGKnbuUXepwMNps5jd1dTRHdywLnV1wNodnHc5f1vyFeSVHg1K4l75EPLF+v9Euz9/fNDY2pnWyp4N/P2AymXRfXm1AiOX8AxwyJJMRfhv/t6iGSHTH7N8kwi99PrZEIjwVCHT+XET4n5H/Q5YliwcqX2BL6Ym4Kl7vscVlOg5H9YXYh1c6Kw/r4J9mIkJeXp5e7tEGhK45/yLCxQdmsaE+xOfrds5oOcRq5YyMDL4LhXYKgA6Tg5tG3UR1sJp7XVakrRnnitlx7xXb+N0fS7eHQqG071no4J9GsbROXa5ZG0i6Lv0cU+ok32nmlYU13YL073w+nopzmHGUaxSXlFzCvwOLmFU4Dtfyv0E0fmpnJBLZL3v9pnvWDzr4p42IkJmZ2TlL0rSBwmKxdKYrGw3ChROzWFYdZPHm5p2us3fU/dnc1sbKXU64nld0HhPcE3jI2kxlaBsZlf+Oey+l1H638auUorExfu9iAKKp+Y1AB/80MRqN+jCXNmB1nf1PGenGYzPyyqLuVTmjSnFJVRW31dQQ7TITNoqRGw+4EbPRzm25+WQs+2vCewWDwf2q2cvu9in8X/6G3Lk3QZJ/M9DBPw0MBgP5+fn71KJN0/YHXXP+rSYD547zMa+yidW1Oy/RGET4icvFwlCId5p3/s0gy5rFdSOuY5lZeCa0qseCb/X1iTeF+5uelnwk1IBjzXtErF5I8j6gjj4pFtvg1ev82kDWNecf4JwxXmwmYdai7lU5z83MZLTZzEPbt9O6S1A8wn8Ep2ZP5jm3i5XfJ2720tDQsF+kfe4ut9+5+l0MkSCBkeclfSw6+KdQrFqnzWZL91A0Lem6Nop32YycPsrDhyvrqW7ceYnGKMJtHg8bIhFeilPn5qoR/80QsXFvaCnNjRsT3q/HdfR+oqGhIXFmn1I4V7xGq280oawxSR+LDv4pIiJ4PB4cDke6h6JpKWG323cKdFPH+1DA60u6z/6Psds5zmZjS5z0R5vRxk1Df0y10cCz5ffFvVds4zfdGTQ92V1uv7WmHGvdipTM+kEH/5SIneDVB7m0wUREdprs5DktHDfUxdtLt9MU6h7kn8zO5q4E/42UFZ7AlW0ZzAlV8p/qz+NeE4lE+nWnr9bW1h6XppwVfydqstNYOiUl49HBP8ligd/n86V7KJqWcl2zfgAunOCjKRztVvAN2k/+AixubWVTnJLNU0unM6a1lccrHmV7qPvz+3vaZ88bvY041v6LxtIpKEtqVgd6FfxFxCcic0RkRcffcT+2RSQiIgs7/rzZm3vuT3Tg1wa7rjn/AAdk2zkwP4O/f1dLW7R7IKyPRrm4qoqH42TvtJacwq8DbbREgjy28rG4gbSlpSXtJ2fj2V2DdseadzG0BWkYeX7KxtTbmf/twIdKqRHAhx3fx9OilDqw48/ZvbznfkFEyMrK0oFfG/S6zf4n+qhqamPuqkC3a90GA5c7HPyjqYllu7ZrNJrJKT2H6+vqmFczj4+rPo57v0Cg++umW/Muaaw7UQrXitdp9Y6kNQUbvTG9Df7nALGi288DP+zl6w0IsfLMLpcr3UPRtLTbNcnhsCIHJR4LsxZ3L/kA8GO3G6cID8ZZwmkYeT6X1Tcw3uDh6dVPUxvaefM4lvPf3zZ+exqTtaYca+0yAiOnJj23v6veBv9cpdRmgI6/cxJcZxOR+SLypYgk/IAQkWs6rptfXV3dy6GlnohgMpkoLCzcqbqhpg1mu+b8G0S4YEIWK2taWbCp+4zYbTDwY7ebucEg83bJiW9zFNBaeDS/2bqZcDTMEyuf6BZUlVK0dOkVkG5tbW09Np13VrzWvtFbdloKR7UHwV9EPhCRJXH+nLMX9ylWSh0CXAL8r4gMi3eRUupJpdQhSqlDsnfp9dnfxWr1DBkyRNfl17RddM35BzhpuAuv3cisxd1LPgBc4XAw3GRiQ5yN38ABFzCssZornIcwr2Yen237bKfH+9vGb089eg0dJ3oby05P2UZvzG6bxSqlTkr0mIhsFZF8pdRmEckHqhK8xqaOv1eLyFzgB8CqfRty/xM7vKVz+DUtPpvNhoh0ztItJgPnjvXx7Pxq1tQGKfPtfPDRZjDwz/x8jHGWQVoKjiTsKODKLauYmz2CJ1c+yQT3BNyWHS1QW1tbaWtrS3s/7N3l9jtWvd1xondqikfW+2WfN4ErOr6+Anhj1wtExCsi1o6v/cBRwPe9vG+/EMtjLi4u1oFf03ogIt32wM4a42kv+bC4+6EvaD/5q5Ti45YW2roGT4ORhhHn4dzyNT8tOI/mSDNPr356p+f2l3o/Peb2K4Wr4jWC/nGEskaldmD0PvjfD5wsIiuAkzu+R0QOEZHYv8ZoYL6ILAI+Bu5XSu3XwV9EsFgs5Ofnk5OTg9FoTPeQNK3fczqdOy39uG0mphzQXvJhW1P8qpz/aW3l6upqXtslTbJh+A9RBhPj13/B1KKpfFL9Cd/WfrvzNQ0Nad/47Wmj11a1AEv96rTM+qGXwV8pVaOUOlEpNaLj79qOn89XSl3d8fUXSqnxSqmJHX8/0xcDTwcRwWw2k5ubS2Fhoa7Ro2l7wWw2d9sPmzreR1TB7PK6uM+ZZLVykMXCH+vraekyg47Ys2gqPgHnqre4IP9MCu2FPL7ycYKRHRvESqmeUyyTLBqN9nh/Z8VrRMwOmkpPSeGodtAnfHdDRBAR7HY7eXl5DBkyhIyMDN12UdP2wa4bvwUuC8eUOXnz+zqa45R8kI6ib1WRCM/vsnEaGHkBxlAAT+XHXDv8Wqpaq3hl/Sudj6d747enQ13Glhoc6z6gcdhZKJM94XXJpIN/ArG0TY/HQ1FREfn5+d0KVWmatncyMzO7/ezCCVk0haK8E6fkA8AhNhsn2u08EQhQ1+X0bjD3YEKuUlzLX2OcZxwn553MGxveYHXj6s5rQqFQ2hq99LTk41zxOhINEzjgwhSPagcd/DvEgrrFYsHr9TJkyBCKi4vxer1pzxjQtIGia4P3mNE57SUfXv2ulnAkfrC82e3GbTBQ2TX1U4TAyKnYtn2HpXY5M0pn4DQ7eXzl40RV+xJRujZ+w+Fw4g+daBhXxWs0508i7C5N6bi6GnTBP7aME/vaZrPh8XjIzc2ltLSUIUOG4PV6dbMVTUuSXcs9AEybmMW2pjY+WhU/UI+0WPiooIAJVutOP28cdhZRoxXX8lk4zA6uLLuSioYKPtjyQec16dj47Sm9M3P9XEzNVQRGX5TSMe1qQAb/rvnEseUbm82Gy+XC5/ORl5dHSUkJZWVlFBQU4PP5yMjI0G0VNS0FLBZLt8nVYUWZDPVZeWXRzr18uzKK0KoUH3bZRI1aXTSWnYZjzT8xtAaYnDOZsa6xvLD2BQLhHTV+dtc3ty/FcvsTcS1/hbCjkOaCo+I+/smaAO9XJP+3lQEZ7TIyMigqKqK0tJSysjKKi4spKCjA7/fjdrux2+06PVPT0mjXjV8RYdrELNbVhZi3PnFHrucCAa7Zto3FXer2Bw6YhqEtiHPVm4gI/zX8v2hqa+KFtS8Aqd/47SnDx1JXgX3rt+1r/YadY1BdJMJl67dwzxebeHtpHZE4VU/70oAM/rGUTD2T17T+Kd7G7/HDXOQ4TLyyKH7JB4BLnU58BgP3d+naFcoaRTD7QFzLZ4GKUpJZwtmFZzNnyxyWB5YD7WvwPdXX6Us9dRRzLX2FqNFGw/Du1XFu37SN/0Rbyfda+O2UIowG3cBd07QBxmAwdDsVbzIIF07I4rstLSzZEn/27DQYuN7tZl5rK3O7FH2rHzUNc0Ml9k3/AWBa8TR8Fh9/XvVnoiqaso3fnj5kDME6HGvepbHsNKJW906PvbE1wAeqlcItUR47vhiHNfkrEzr4a5qWFrsu/QCcdoAHt83ISwu2JXzeRQ4HpSYT99XVEe6YYTcVn0ib3Y9r2d8AyDBlMKNsBqsaV/Hh1g+B9gbvPbVR7As9bfS6ls/CEAlSP+bSnX6+sibIndtqMbcqXhxbgMeemuxCHfw1TUsLi8XS7cSv3Wzgggk+vqpsoqI6fllmiwh3ejw4DAZqYnn/RjMNI84nY+NnmBoqATg2+1hGu0bz4toXaWpr3/BtbEy8n9BbSqmEFTylLYh7+d9oKjyGsGdHUePNgRD/b9FGgk4Dd3u9lDitcZ+fDDr4a5qWNvFm/+eM8eKwGHixh9n/CXY7r+XmktflDE5g5Hkgxs7Zv4hw9dCrCYQDzFo/q3PjN1lpn83NzYmrd65+G2Owjvqxl3f+rKY5zM3vrMe5qY0brU4uyXLGfW6y6OCvaVraZGZmdgv+mRYj543z8fnaRlbXBuM+T0QwiFATifBORxpnJCOHxtJTcK2YjSHUPgMf7hzOibkn8tamt9jQvIFIJEJrl0yhvpTwRG80grv8RYJZYwjmHgxAIBjhlncqqWuN8OApxVyf60159QAd/DVNS5t4pZ4Bzhvnw2428PKCxJk/AI8FAvy0poYVHadp68dejqGtGWfF3zuvmV46HavByrOrn01a2mc4HE74oZKx4d9YGtZTP/YKEKElHOWOf61nuS1C8wkO3L70HCjVwV/TtLSKF/xdNiPnjPEyd1WA9dsTz9SvdbnIEOHXtbUopQj5DqA5/3DcS/8KkfYPBI/Fw4XFF/JN3TcsqFtAS0sLbXE6hPVGwlm/UnjKXyDsKKSp+ARCkSh3v1/J93VBWifYcJgN5KTpzJEO/pqmpZXJZNqpx2/MBRN8WE3C898kXvvPMhq5yePhi9ZW3u44XFU/5nJMLdU41r7bed2ZBWeSZ8vjudXPEVGRHlsr7q1oNJrw9WxbvsZWvYj6MdOJYOTeDzfx7cZmhhznoV4Uv/X5MKWpWKQO/pqmpZ3X233N22s3cf54Hx+vCrCqJv7aP8AlDgfjLBburaujIRqlpWASrZ4ReMpfhI7ZuNlg5oqyK1jXvI45m+f0WHFzbyXMIFIK76InaMvIoX74OTz0yWY+XdvAKcdk8YUpzNVOZ7daRamkg7+maWlntVrjVs+dNiELh8XAM19XJ3yuUYTfeL0carPRqhSIUD92OpbtK7Fv+qLzuklZkxjjGsPL616mKdzUJ/V+esogsm+eh71qAXXjrmLmV9t5r6KeGQf7WecXykwmbnC747xi6ujgr2la2olI3Nm/w2rkoolZfLm+kfKtiWvmTLBaedTvx9+xft5YOoW2jFw83z3TOfsXEa4aehX14XpeXf8qdXXxu4ftjdbWViKR7k1o2mf9j9OWkcdjgaN5fUkdU8f7mH6Qn0f8fp7PycGW5vIzOvhrmtYvxEv7BDh3nA+v3cgzX1XvdqlmTTjMXbW1hA0mto+7CnvVgs6SDwAjnCOYnDOZNze+yebGzQSDiZeT9kTCWf+m/2CrXsyHvmk8tzDAlJFujjnIw/ZoFLMIhf2gR4gO/pqm9Qsigsfj6fYBYDcbuPQHfhZubmb+hp6XairCYV5pbOSJQIDAiHMJOwrwLpzZOfsHuKzkMkSEF9e+2Ku0z3A4TEtLnFPIHWv9AUsO1608mOOGOrnyqByu2baNG2t6Tl1NJR38NU3rN+KlfQKcOdpDgcvMY//ZSlsPpY5Pzcjg7IwM/lRfT3lEUTfhv7DVfE9G5dzOa7Jt2ZxdeDZzq+byXdV3+5z2mWjTOHPdHGzbvuO+prM5qMjNHZMLuHt7HXWRCLd5PPt0r2TQwV/TtH7DYDB0a/MIYDEa+O8jclm3PcQ/ynteq7/H68VrMHBLTQ21ZacRcpXiW/gYRHeszZ8/5HzcZjfPrn52n9b+I5H46aISbiFz3u/5PlrC8uzT+OXJQ5gdbGZOSws3ezyM2aWWUTrp4K9pWr8Sb+kH4MgSB4cOyeT5+dXUtSSerXuMRn6blcXycJiXmlqom/hjLNtXkrn2/c5rMkwZTCuexpL6JXy07qO9rvaZqFNXw+d/xtFaxXPOa/j1lBLWRtv4TV0dR1qtXBXnQy2ddPDXNK1fMZlMcZu9iAg/OTKXYFuUZ76q6vE1TrDbedDn42KHg6bSk2n1jsS34BEkvGON/tS8UymwF/CX1X+hdnvtHo8v1htg1yWf8ooKDlj3Vz42HcP0s04lw2Ik22jkJLud3/v9GNJ0mCsRHfw1Tet3fD5f3Nl/scfKeeN9vLu8nqVV8Us+x5zncGA3GGhUsPjQOzE3bcG76PHOx00GEzPKZrChZQOvLnt1jw99xWsIP39DI9YvHiIqRnKm3IHdbCCsFD6jkf/1+9NWwqEnOvhrmtbvJJr9A1x+kB9fhokH/r2JUFvPyzVKKWZUVXGlymHriAtxL/0rlpplnY8f5juMsa6xvLz2ZTbXbN7tuJRS1NXV7RT8v97QyCfv/51TDF9TN/4q7L58/lBfz/SqKoJJbh7TGzr4a5rWL8U79AXtJZ9vOS6fdXUhnp2f+OQvtC8VXet2Ux4O89/DZhC2esn+8tedm78iwpVDr6Q+XM+z3z2729l/Q0PDTvsDX1c2MvO9hdxneoom3xiCE2fwf42NPB4IUGYypf0gV0/678g0TRvUzGYzGRkZcR87rMjBWaM9vLq4lkWbE5/8hfb1/xvdbmYHw1x32INYapbiWvZK5+MjnCM4NvtYZm+YzZrqNQlfRylFbUf1UIAv1jVwz/vr+JP1MTJMUHPc/bzZEuLu2lqOs9n4lc+3D+86dXTw1zSt30q09g/w4yNyyXOaeWDuJppDcUosdHGdy8UVDgdPGXw8OPYGsr79I9aqhZ2PX1Z6GUopHlnwSMLZf9f+vO9X1POL9zdwZ+ZbTIgupeaIO5lj8nNLTQ2HWq3M9Pux9LMN3l3p4K9pWr9lNpvj5v1D+8nfO44vYEtDmIc+2Uy0hyUbEeHnXi//43Jx3OhzCGfmkzf3Z5gaNwGQa8vlrMKz+GjLR3yz4Ztuz49Go51r/a8vqeX+uZu4OmsJ08Ov0jD0DBqHnk6JycQJdjtPZmdj78fLPTH9f4Sapg1qidb+AcblZfCjw3KYu7qB53az/m8Q4QaPh+wMLxtPeIRHck/E9/FPkVB7SeapRVNxmV089M1D3fL+A4EAkWiUJ+dV8acvtnJd3lLuaH6AoG80L0z4GUophprNPJ6djXM/CPygg7+maf2c0Wjs8QNg2kQfp4/y8PKCGv61fM9q9XxoyeFnZdM5veRKjJ/ejaG1nkxTJpeWXEp5fTlvLX+r89pQKMSmqhp+8V4lryyq4faSCn4WuJ/qrPFcdOiDXLe9kffj1fjp53oV/EXkAhEpF5GoiBzSw3VTRGS5iKwUkdt7c09N0wYft9uNIcGMWkS48eg8Di7M5OFPN/PNboq/Qfsm8B+ysvjaPYrDSmbwz3mPYaxewkl5J1GaWcojix9h9foWjj1WMefzjVz/xhq+Xr+dvwz7hB9V/5Znyy5k7Phf8VYwzC1uN6fE6UTW3/V25r8EOA/4JNEFImIEZgKnAWOAi0VkTC/vq2naICIi+P3+hLN/k0G456RCitxW7vjXet6vqN/ta56dmcms/AKKbU5+UnopP1+7gKzvnuNH+T+kKljF5T9dwWefwWW3GBjSsIivffcweeMTXH7gPfyo6EKKTGZez83lx253wnH1Z9IXrcxEZC5ws1JqfpzHJgG/VEqd2vH9HQBKqft6es1DDjlEzZ/f7eU0TRvEtmzZQnNz4tTOhtYI98zZwMJNzVx+kJ8rDk78gRGjlOLDQC2jyp/m2JWvYL23ilBb9/aKVlMraz94mQ/9h7M5EuGHmZlJLdlQWlqa8LednojIN0qphCsxMalY8y8EKrt8v6HjZ92IyDUiMl9E5ldX97x5o2na4JOdnd1jMHdajfzutGJOHenmhW+3cee/Kllb19rja4oIJ7mzGDLpVlac8Rp3PfAE7mNWgbW9eJxY2/CcuIGZc1bSXDSZSXY75zkc/a5Wz97abTsZEfkAyIvz0F1KqTf24B7x/heK++uGUupJ4Elon/nvwWtrmjaIGI1GsrOzqa5O3NXLbBRuPS6fYVk2np9fzdWvrWbKSDcXTsyiyG3p9uGhlGJFTZDP1jTwzrIIdS3DycFOfciAmIMQsnJGnpPji0OpeIsps9vgr5Q6qZf32AAUdfl+CLCpl6+padoglZmZSUNDQ/wuWh1EhKnjfZw8wsXLC2p4o7yOfy6vx20zMjbXTq7DTFMoSlMowsqaVrY2hjEIHFSYyYyDs/nTQjdHzmhh+aib2PDh6WytOj6F7zA1UtFI8mtghIiUARuBi4BLUnBfTdMGIBEhJyeHysrK3dbhd9tMXDspl6njfXxV2Uj51haWbGlm0eZmMi0GHBYjw7KsXH6Qn0klDjz29pD47LP15Ofn8+/1F3F97vWcVHIZcEEK3l3q9Cr4i8i5wKNANvCOiCxUSp0qIgXA00qp05VSbSJyHfAeYASeVUqV93rkmqYNWkajkfz8fDZt2rRHpZhzHGbOHO3lzNHe3V5rMBjIzc1FRJhcMpnJhZOZVTmLo7OPJt+e3xfD7xd6teGrlJqtlBqilLIqpXJjGT1KqU1KqdO7XPdPpdRIpdQwpdS9vR20pmma1Wrd7Qbw3hIRcnNzMXapv3/XpLswG8w8UvEIEdVzDaH9iT7hq2nafsvhcODuozz72HKSfZcDW3mZedx++O18H/ietze93ev79Bc6+Guatl/zer29/gCIBf5EDWTOGXYOxxYey0trX2JD84Z9vk9/ooO/pmn7NRHB5/P1eAJ4d8/Pzs5OGPhj1/zqqF9hM9n4Y8Ufk7r8s75pPVuDW5P2+jE6+GuaNiA4nU7y8vIwGAx79CEgIlgsFgoLC3E4HLu93m/3c/cRd1PRUMGLa1/siyF3E4wE+d3S3/HrJb8mqpLbAlIHf03TBgy73U5JSQk+ny/hh4CIdP62UFhYiMVi2ePXn1I2hWkHTGP2htl8Vv1ZXw4dgKdWPcXGlo1ce8C1GA3Jbfqeijx/TdO0lBER3G43TqeTlpYWwuEwoVCISCSCzWYjIyMDi6X7Sd89dduht1FRW8GjKx6lKLOIkoySPhn3p9Wf8sHWD7h46MWcMf6MpBeL0zN/TdMGJIPBQGZmJh6Ph5ycHPLz8/F6vVit1l4FVrPRzMPHP4zL4uL+pffT0NbQ67FuDW7lsRWPMdY7lpuPvHmfCrrtLR38NU3T9pLf7ufh4x+mprWGX5T/gu3hPWsiE09jWyO/W/Y7xCD8/oTfYzHu+TJUb+jgr2matg8mZk9k5okz2dy8mXu+v4dANLBXv1GICA2RBu75/h4qmyp58NgHKXTELXicFDr4a5qm7aPD8w/n8ZMep6q5ijsX30mTvQmbzda5qbyr2M8tFgsGh4Fffv9LKhsrefSERzlmyDEpHbsO/pqm5/y0hwAABANJREFUab1wcO7BPHnKkzSEGpg+Zzqzq2aTk5+D3+/H4/GQmZlJRkYGHo+H7OxsCgsLKW8r55p/X8PGxo3MPHEmRxYemfJx90knr2TQnbw0Tduf1AZreeDrB3hn9TuUucu4cOSFHJp3KCO8IxCEmmANy2uX88SiJ1hYvZAR3hHcM+keJmZP7NNx7GknLx38NU3T+tDnGz/nwa8fZFX9KgDcVjehSIiWtvb+A1m2LK7/wfX8cPgPk5LLv6fBX+f5a5qm9aGjCo/iqMKj2Ny4ma+2fMW3Vd9iN9kpchZR7Czm4NyDyTBnpHuYeuavaZo2kPSnBu6apmlaP6ODv6Zp2iCkg7+madogpIO/pmnaIKSDv6Zp2iCkg7+madogpIO/pmnaIKSDv6Zp2iDUbw95iUg1sC7d49gHfmBbugeRYvo9Dw76Pe8fSpRS2bu7qN8G//2ViMzfk9N1A4l+z4ODfs8Di1720TRNG4R08Nc0TRuEdPDve0+mewBpoN/z4KDf8wCi1/w1TdMGIT3z1zRNG4R08E8iEblZRJSI+NM9lmQTkQdFZJmILBaR2SLiSfeYkkFEpojIchFZKSK3p3s8ySYiRSLysYgsFZFyEbkh3WNKFRExisgCEXk73WNJBh38k0REioCTgfXpHkuKzAHGKaUmABXAHWkeT58TESMwEzgNGANcLCJj0juqpGsDblJKjQaOAH4yCN5zzA3A0nQPIll08E+ePwC3AoNiU0Up9b5Sqq3j2y+BIekcT5IcBqxUSq1WSoWAV4Bz0jympFJKbVZKfdvxdQPtwbAwvaNKPhEZApwBPJ3usSSLDv5JICJnAxuVUovSPZY0uQp4N92DSIJCoLLL9xsYBIEwRkRKgR8A89I7kpT4X9onb9F0DyRZdAP3fSQiHwB5cR66C7gTOCW1I0q+nt6zUuqNjmvuon2p4OVUji1FJM7PBsVvdiLiAP4O3KiUCqR7PMkkImcCVUqpb0RkcrrHkyw6+O8jpdRJ8X4uIuOBMmCRiED78se3InKYUmpLCofY5xK95xgRuQI4EzhRDcwc4g1AUZfvhwCb0jSWlBERM+2B/2Wl1OvpHk8KHAWcLSKnAzbAJSIvKaUuS/O4+pTO808yEVkLHKKU2t+KQ+0VEZkCPAwcp5SqTvd4kkFETLRvZp8IbAS+Bi5RSpWndWBJJO0zmOeBWqXUjekeT6p1zPxvVkqdme6x9DW95q/1lT8BTmCOiCwUkSfSPaC+1rGhfR3wHu0bn7MGcuDvcBQwHTih4991YceMWNvP6Zm/pmnaIKRn/pqmaYOQDv6apmmDkA7+mqZpg5AO/pqmaYOQDv6apmmDkA7+mqZpg5AO/pqmaYOQDv6apmmD0P8HD8nHkt9Gfn0AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x115fe2350>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "## adding data points\n",
    "x = [-2, 0, 4, 2]\n",
    "y = [1, 0.3, -1, 0]\n",
    "\n",
    "x_test = np.linspace(-5, 5, 100)\n",
    "l_a = 1.0\n",
    "\n",
    "signal_var = 0.1\n",
    "# Updating GP mean\n",
    "## K(X,X)\n",
    "K_xx = computeCovariance(x,x, l_a, signal_var)\n",
    "## K(X*,X)\n",
    "K_sx = computeCovariance(x_test, x, l_a, signal_var)\n",
    "alpha = np.linalg.solve(K_xx,y)\n",
    "mu_post = np.dot(K_sx, alpha)\n",
    "\n",
    "# updating GP variance\n",
    "K_ss = computeCovariance(x_test, x_test, l_a, signal_var)\n",
    "V_post = K_ss - np.dot(K_sx, np.dot( np.linalg.inv(K_xx), K_sx.transpose()))\n",
    "\n",
    "stdv = np.sqrt(np.diag(V_post))\n",
    "\n",
    "for i in range(3):\n",
    "    f_post = sampleFromGaussian(mu_post, V_post, len(x_test))\n",
    "    plt.plot(x_test, f_post)\n",
    "    \n",
    "plt.plot(x_test, mu_post, 'c--')\n",
    "plt.fill_between(x_test, mu_post - 2*stdv, mu_post + 2*stdv,color=\"#dddddd\")\n",
    "plt.plot(x, y, 'b*')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Covering GP in a function. Recomputing covariance**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1160e3650>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# x - training inputs\n",
    "# y - training values\n",
    "# xs - inputs to get predictions for from GP\n",
    "def sampleFromGP(xs, x, y):\n",
    "    l = 0.5\n",
    "    sig_var = 0.01 # signal variance\n",
    "    \n",
    "    K_xx = computeCovariance(x, x, l, sig_var)\n",
    "    K_sx = computeCovariance(xs, x, l, sig_var)\n",
    "    alpha = np.linalg.solve(K_xx,y)\n",
    "    mu_post = np.dot(K_sx, alpha)\n",
    "\n",
    "    # updating GP variance\n",
    "    K_ss = computeCovariance(xs, xs, l, sig_var)\n",
    "    V_post = K_ss - np.dot(K_sx, np.dot( np.linalg.inv(K_xx), K_sx.transpose()))\n",
    "    y_post = sampleFromGaussian(mu_post, V_post, len(xs))\n",
    "    return y_post, mu_post, V_post\n",
    "\n",
    "x = [-2, 0, 4, 2]\n",
    "y = [1, 0.3, -1, 0]\n",
    "x_test = np.arange(-5,5,0.1)\n",
    "\n",
    "(y_1, mu_1, V_1) = sampleFromGP(x_test, x, y)\n",
    "\n",
    "stdv = np.sqrt(np.diag(V_1))\n",
    "plt.fill_between(x_test, mu_1 - 2*stdv, mu_1 + 2*stdv,color=\"#dddddd\")\n",
    "plt.plot(x_test, y_1)\n",
    "plt.plot(x,y, \"r*\")\n",
    "\n",
    "\n",
    "x.append(-4)\n",
    "y.append(-1)\n",
    "\n",
    "(y_2, mu_2, V_2) = sampleFromGP(x_test, x, y)\n",
    "\n",
    "stdv = np.sqrt(np.diag(V_2))\n",
    "plt.fill_between(x_test, mu_2 - 2*stdv, mu_2 + 2*stdv,color=\"#c3e0b1\")\n",
    "\n",
    "plt.plot(x_test, y_2)\n",
    "plt.plot(x[-1],y[-1], \"g*\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Side note on Cholesky decomposition\n",
    "\n",
    "Cholesky decomposition is used to decompose a matrix with specific properties into a product of a lower triangular matrix and its transpose $ LL^T=A$. \n",
    "This is frequently used to solve systems of equations of type $Ax=b$. (Q) _Because it is easier to invert lower triangular matrices than full matrices(?)_\n",
    "Applying decomposition on A, we get $LL^T x = b$ and denoting $L^Tx = y$ we need to solve $Ly=b$ and then $L^Tx = y$ to find x.\n",
    "Then $x = (LL^T)^{-1}b$ or fancy way $x= L^T\\(L\\b)$\n",
    "\n",
    "## Efficiently computing inverse\n",
    "You should not compute the inverse of the matrix when codin. Super expensive operation\n",
    "Instead $A^{-1}y$ can be considered as $Ax=y$ and then solved as $A\\y$, where $\\$ means calling some fancy efficient solving function from some library, for python *np.linalg.solve*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dictionary on Bayesian Optimization\n",
    "Here I will put the mapping of concepts to my understanding of them\n",
    "\n",
    "**Bayesian Optimization** - (Wiki) is a sequential design strategy for global optimization of black-box functions that doesn't require derivatives.\n",
    "\n",
    "**Sequential model based optimization** - ...\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
